/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package biblioteka;

import java.util.*;

/**
 *
 * @author discovery
 */
public class Biblioteka {
    private Set<Uzytkownik> uzytkownicy = new HashSet<>();
    private List<Ksiazka> ksiazki = new ArrayList<>();
    private Map<Uzytkownik, List<Ksiazka>> wypozyczenia = new HashMap<>();
    
    private int maxKsiazekNaUzytkownika = 2;
    
    public void dodajKsiazke(String autor, String tytul, String gatunek) {
        // Metoda tworzy nową książkę i dodaje ją do kolekcji książek w bibliotece
        //  Tworzenie nowej książki
        Ksiazka ksiazka = new Ksiazka();
        ksiazka.setAutor(autor);
        ksiazka.setTytul(tytul);
        ksiazka.setGatunek(gatunek);
        ksiazka.setCzyWypozyczona(false);
        
        // Oraz dodanie nowej książki do kolekcji
        ksiazki.add(ksiazka);
        
        // Wyświetlenie komunikatu
        System.out.println("Książka " + tytul + " została dodana do systemu.");
    }
    
    public void dodajUzytkownika(String imie, String nazwisko) {
        // Metoda dodaje nowego użytkownika do systemu
        //   Tworzenie nowego użytkownika
        Uzytkownik uzytkownik = new Uzytkownik();
        uzytkownik.setImie(imie);
        uzytkownik.setNazwisko(nazwisko);
        
        // Oraz dodanie nowego użytkownika do kolekcji
        uzytkownicy.add(uzytkownik);
        
        // Tworzymy i dodajemy listę w której będą książki które wypożyczył uzytkownik
        wypozyczenia.put(uzytkownik, new ArrayList<Ksiazka>());
    }
    
    public void wypozyczKsiazke(Ksiazka ksiazka, Uzytkownik uzytkownik) {
        // Metoda wypozycza podaną książkę podanemu użytkownikowu

        // W pierwszej kolejnosci spradzamy czy użytkownik nie osiągnął limitu książek
        if(uzytkownik.liczbaWypozyczonychKsiazek() < maxKsiazekNaUzytkownika) {
            // Następnie sprawdzamy czy książka nie jest wypożyczona
            if(ksiazka.getCzyWypozyczona()) {
                // Książka jest wypożyczona!
                System.out.println("Książka jest wypożyczona!");
            } else {
                // Użytkownik może wypożyczyć ksiązkę,
                //  zapisujemy informację o książce w profilu uzytkownika i w bibliotece
                uzytkownik.dodajKsiazke(ksiazka);
                wypozyczenia.get(uzytkownik).add(ksiazka);
                ksiazka.setCzyWypozyczona(true);
                System.out.println("Książka została wypożyczna: " + ksiazka.getTytul());
                //System.out.println(wypozyczenia);
            }
        } else {
            // Użytkownik ma wykorzystany limit książek
            System.out.println("Użytkownik " + uzytkownik.getImie() + " " + uzytkownik.getNazwisko() + " wykorzystał limit.");
        }
    }
    
    public void zwrocKsiazke(Ksiazka ksiazka, Uzytkownik uzytkownik) {
        // Metoda zwraca książkę
        uzytkownik.usunKsiazke(ksiazka);
        wypozyczenia.get(uzytkownik).remove(ksiazka);
    }
    
    public void wyswietlKsiazki() {
        // Metoda wyswietla wszystkie ksiazki w bibliotece
        //  Do przegladania ksiazek wykorzystany bedzie iterator
        Iterator iterator = ksiazki.iterator();
        
        System.out.println("Lista książek w bibliotece");
        System.out.println("Tytuł    \t\t\t|Autor    \t\t\t|Gatunek\t\t\t|Wypożyczona");
        System.out.println("-------------------------------------------------------------------------------------");
        
        while(iterator.hasNext()) {
            // Pobranie kolejnej książki i rzutowanie typu na książkę z iteratora
            Ksiazka ksiazka = (Ksiazka)iterator.next();
            System.out.println(ksiazka.getTytul() + "\t\t\t|" + ksiazka.getAutor() + "\t\t\t|" + ksiazka.getGatuenk() + "\t\t\t|" + ksiazka.getCzyWypozyczona());
        }
    }
    
    public void wyswietlKsiazki(String gatunek) {
        // Metoda wyswietla wszystkie ksiazki w bibliotece danego gatunku
        //  Do przegladania ksiazek wykorzystany bedzie iterator
        Iterator iterator = ksiazki.iterator();
        
        System.out.println("Lista książek w gatuku: " + gatunek);
        System.out.println("Tytuł    \t\t\t|Autor    \t\t\t|Gatunek");
        System.out.println("-------------------------------------------------------------------------------------");
        
        while(iterator.hasNext()) {
            // Pobranie kolejnej książki i rzutowanie typu na książkę z iteratora
            Ksiazka ksiazka = (Ksiazka)iterator.next();
            
            // Spradzamy czy jest odpowiedni gatunek
            if(ksiazka.getGatuenk().equals(gatunek)) {
                // gatunek książki jest zgodny z podanym przez użytkownika
                System.out.println(ksiazka.getTytul() + "\t\t\t|" + ksiazka.getAutor() + "\t\t\t|" + ksiazka.getGatuenk());
            }
        }
    }
    
    public void wyswietlWypozyczoneKsiazkiUzytkownika(Uzytkownik uzytkownik) {
        // Metoda wyświetla wypozyczone ksiązki podanego użytkownika
        List<Ksiazka> wypozyczoneKsiazki = wypozyczenia.get(uzytkownik);
        
        if(wypozyczoneKsiazki.isEmpty()) {
            System.out.println("Użytkownik " + uzytkownik.getImie() + " " + uzytkownik.getNazwisko() + " nie wypożyczył książek.");
        } else {
            System.out.println("Użytkownik " + uzytkownik.getImie() + " " + uzytkownik.getNazwisko() + "Wypożyczył:");
            
            for(Ksiazka ksiazka : wypozyczoneKsiazki) {
                System.out.println("\t" + ksiazka.getTytul() + " " + ksiazka.getAutor() + " " + ksiazka.getGatuenk());
            }
        }
    }
    
    public void wyswietlWypozyczoneKsiazki() {
        // Metoda wyświetla wszystkie wypozyczone książki
        
        wypozyczenia.size();
    }
    
    public void wyswietlUzytkownikow() {
        // Metoda wyświetla listę użytkowników w bibliotece
        //  Do przeglądania użytkowników wykorzystana będzie pędla forach
        
        // Lecz w pierwszej kolejności spradzamy czy w kolekcji są użytkownicy
        if(uzytkownicy.isEmpty()) {
            System.out.println("Brak użytkowników w systemie");
        } else {
            System.out.println("Lista użytkowników w systemie");
            System.out.println("Imię\t\t\t|Nazwisko\t\t\t|Wypożyczonych książek");
            System.out.println("------------------------------------");
            
            // Pętla foreach
            for(Uzytkownik uzytkownik : uzytkownicy) {
                System.out.println(uzytkownik.getImie() + "\t\t\t|" + uzytkownik.getNazwisko() + "\t\t\t|" + uzytkownik.liczbaWypozyczonychKsiazek());
                wyswietlWypozyczoneKsiazkiUzytkownika(uzytkownik);
            }
        }
    }
    
    public boolean czyUzytkownikIstnieje(String imie, String nazwisko) {
        // Metoda sprawdza czy podany uzytkownik istnieje w systemie
        
        // Zakladamy ze użytkownik nie istnieje
        boolean istnieje = false;

        for(Uzytkownik uzytkownik : uzytkownicy) {
            String uzytkownikImie = uzytkownik.getImie();
            String uzytkownikNazwisko = uzytkownik.getNazwisko();
            
            if(uzytkownikImie.equals(imie) && uzytkownikNazwisko.equals(nazwisko)) {
                // Podany użytkownik istnieje!
                istnieje = true;
                // Przerywamy pętlę szukającą użytkownika
                break;
            }
        }
        
        return istnieje;
    }
    
    public Uzytkownik getUzytkownik(String imie, String nazwisko) {
        for(Uzytkownik uzytkownik : uzytkownicy) {
            if(uzytkownik.getImie().equals(imie) && uzytkownik.getNazwisko().equals(nazwisko)) {
                return uzytkownik;
            }
        }
        
        return null;
    }
    
    public Ksiazka getKsiazka(String autor, String tytul, String gatunek) {
        for(Ksiazka ksiazka : ksiazki) {
            if(ksiazka.getTytul().contains(tytul) && ksiazka.getAutor().equals(autor) && ksiazka.getGatuenk().equals(gatunek)) {
                return ksiazka;
            }
        }
        return null;
    }
    
    public Set<Uzytkownik> listaUzytkownikow() {
        return uzytkownicy;
    }
    
    public List<Ksiazka> listaKsiazek() {
        return ksiazki;
    }
}
